/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia;

import java.util.Vector;

/**
 *
 * @author Alejandro
 */
public class MetricaDistribucion {
    
    public double Dmax=Double.MIN_VALUE;
    public Vector Frente;
    public double gamma;
    public int [] Wp;
    
    public MetricaDistribucion(Vector frente)
    {
        this.Frente=frente;
        Wp=new int [this.Frente.size()];
        this.hallar_Dmax();
        this.gamma=0.1*this.Dmax;
        this.hallarVectorWp();
    }
    public double distancia(Individuo i1, Individuo i2)
    {
        double suma = 0.0;
        int limite = i1.getVec_objetivo().length;
        for (int i = 0; i < limite; i++) {
            if(i==0)
                suma += Math.pow(i2.getValorObjetivo(i)-i1.getValorObjetivo(i), 2);
            else
            {
                //Hago la inversa, por que el valor guardado por el algoritmo es la inversa del rendimiento.
                // Y nosotros utilizamos el valor del rendimiento.
                suma += Math.pow((1/i2.getValorObjetivo(i))-(1/i1.getValorObjetivo(i)), 2);
            }
                
        }
        return (Math.sqrt(suma));
    }
    /**
     * Con este metodo hallamos, la distancia maxima que existe en el frente.
     */
    public void hallar_Dmax()
    {
        
        for (int i = 0; i < this.Frente.size(); i++) {
            Individuo i1=(Individuo)this.Frente.get(i);
            for (int j = i+1; j < this.Frente.size(); j++) {
                Individuo i2=(Individuo)this.Frente.get(j);
                double d_actual=this.distancia(i1, i2);
                if(d_actual > this.Dmax)
                    this.Dmax=d_actual;
            }
        }
    }
    
    public void hallarVectorWp()
    {
        for (int i = 0; i < this.Frente.size(); i++) {
            Individuo i1=(Individuo)this.Frente.get(i);
            for (int j = 0; j < this.Frente.size(); j++) {
                if(i!=j)
                {
                    Individuo i2=(Individuo)this.Frente.get(j);
                    double d_actual=this.distancia(i1, i2);
                    //En el vector guardo la cantidad de individuos que estan
                    // a una distancia mayor a Dmax, del individuo i.
                    if(d_actual > this.gamma)
                    {
                        this.Wp[i]++;
                    }
                }
                
            }
        }
    }
    public double calcularMetrica()
    {
        double sumatoria=0;
        double metrica;
        for (int i = 0; i < this.Wp.length; i++) {
            sumatoria = sumatoria + Wp[i];
            
        }
        metrica=sumatoria/(double)(this.Frente.size()-1);
        return metrica;
    }
    
   
    
    
}
